{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Fake News Detection\n",
    "\n",
    "Develop a machine learning program to identify when an article might be fake news. \n",
    "\n",
    "Run by the **UTK Machine Learning Club**.\n",
    "\n",
    "- https://www.kaggle.com/c/fake-news\n",
    "- https://www.kaggle.com/jruvika/fake-news-detection"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "\n",
    "- train.csv: A full training dataset with the following attributes:\n",
    "    - id: unique id for a news article\n",
    "    - title: the title of a news article\n",
    "    - author: author of the news article\n",
    "    - text: the text of the article; could be incomplete\n",
    "    - label: a label that marks the article as potentially unreliable\n",
    "        - 1: unreliable\n",
    "        - 0: reliable\n",
    "- test.csv: A testing training dataset with all the same attributes at train.csv without the label.\n",
    "\n",
    "- submit.csv: A sample submission that you can"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:11.235841Z",
     "start_time": "2019-01-19T05:53:11.231331Z"
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'/Users/datalab/bigdata/kaggle_fakenews'"
      ]
     },
     "execution_count": 138,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pwd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:11.391955Z",
     "start_time": "2019-01-19T05:53:11.237902Z"
    },
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "fake-news-detection.zip  kaggle_fakenews.zip      \u001b[31mtrain.csv\u001b[m\u001b[m*\r\n",
      "kaggle_fake_news.ipynb   \u001b[31mtest.csv\u001b[m\u001b[m*                年终奖扣税.jpeg\r\n"
     ]
    }
   ],
   "source": [
    "ls"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:11.407295Z",
     "start_time": "2019-01-19T05:53:11.396395Z"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'0.20.1'"
      ]
     },
     "execution_count": 140,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import sklearn\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "sklearn.__version__"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:12.542337Z",
     "start_time": "2019-01-19T05:53:11.411275Z"
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>title</th>\n",
       "      <th>author</th>\n",
       "      <th>text</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>House Dem Aide: We Didn’t Even See Comey’s Let...</td>\n",
       "      <td>Darrell Lucus</td>\n",
       "      <td>House Dem Aide: We Didn’t Even See Comey’s Let...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>FLYNN: Hillary Clinton, Big Woman on Campus - ...</td>\n",
       "      <td>Daniel J. Flynn</td>\n",
       "      <td>Ever get the feeling your life circles the rou...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>Why the Truth Might Get You Fired</td>\n",
       "      <td>Consortiumnews.com</td>\n",
       "      <td>Why the Truth Might Get You Fired October 29, ...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>15 Civilians Killed In Single US Airstrike Hav...</td>\n",
       "      <td>Jessica Purkiss</td>\n",
       "      <td>Videos 15 Civilians Killed In Single US Airstr...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>Iranian woman jailed for fictional unpublished...</td>\n",
       "      <td>Howard Portnoy</td>\n",
       "      <td>Print \\nAn Iranian woman has been sentenced to...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id                                              title              author  \\\n",
       "0   0  House Dem Aide: We Didn’t Even See Comey’s Let...       Darrell Lucus   \n",
       "1   1  FLYNN: Hillary Clinton, Big Woman on Campus - ...     Daniel J. Flynn   \n",
       "2   2                  Why the Truth Might Get You Fired  Consortiumnews.com   \n",
       "3   3  15 Civilians Killed In Single US Airstrike Hav...     Jessica Purkiss   \n",
       "4   4  Iranian woman jailed for fictional unpublished...      Howard Portnoy   \n",
       "\n",
       "                                                text  label  \n",
       "0  House Dem Aide: We Didn’t Even See Comey’s Let...      1  \n",
       "1  Ever get the feeling your life circles the rou...      0  \n",
       "2  Why the Truth Might Get You Fired October 29, ...      1  \n",
       "3  Videos 15 Civilians Killed In Single US Airstr...      1  \n",
       "4  Print \\nAn Iranian woman has been sentenced to...      1  "
      ]
     },
     "execution_count": 141,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv('train.csv')\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:12.550627Z",
     "start_time": "2019-01-19T05:53:12.544675Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'House Dem Aide: We Didn’t Even See Comey’s Letter Until Jason Chaffetz Tweeted It'"
      ]
     },
     "execution_count": 142,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.ix[0]['title']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-06-06T06:35:30.201494Z",
     "start_time": "2019-06-06T06:35:30.149706Z"
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "769.2307692307693"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "10000/13"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:12.563892Z",
     "start_time": "2019-01-19T05:53:12.558545Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0   -- >  House Dem Aide: We Didn’t Even See Comey’s Letter Until Jason Chaffetz Tweeted It\n",
      "1   -- >  FLYNN: Hillary Clinton, Big Woman on Campus - Breitbart\n",
      "2   -- >  Why the Truth Might Get You Fired\n",
      "3   -- >  15 Civilians Killed In Single US Airstrike Have Been Identified\n",
      "4   -- >  Iranian woman jailed for fictional unpublished story about woman stoned to death for adultery\n"
     ]
    }
   ],
   "source": [
    "for k, i in enumerate(df['title'][:5]):\n",
    "    print(k,'  -- > ',  i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:12.571892Z",
     "start_time": "2019-01-19T05:53:12.566300Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    1\n",
       "1    0\n",
       "2    1\n",
       "3    1\n",
       "4    1\n",
       "Name: label, dtype: int64"
      ]
     },
     "execution_count": 145,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['label'][:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:12.578721Z",
     "start_time": "2019-01-19T05:53:12.573959Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'House Dem Aide: We Didn’t Even See Comey’s Letter Until Jason Chaffetz Tweeted It By Darrell Lucus on October 30, 2016 Subscribe Jason Chaffetz on the stump in American Fork, Utah ( image courtesy Michael Jolley, available under a Creative Commons-BY license) \\nWith apologies to Keith Olbermann, there is no doubt who the Worst Person in The World is this week–FBI Director James Comey. But according to a House Democratic aide, it looks like we also know who the second-worst person is as well. It turns out that when Comey sent his now-infamous letter announcing that the FBI was looking into emails that may be related to Hillary Clinton’s email server, the ranking Democrats on the relevant committees didn’t hear about it from Comey. They found out via a tweet from one of the Republican committee chairmen. \\nAs we now know, Comey notified the Republican chairmen and Democratic ranking members of the House Intelligence, Judiciary, and Oversight committees that his agency was reviewing emails it had recently discovered in order to see if they contained classified information. Not long after this letter went out, Oversight Committee Chairman Jason Chaffetz set the political world ablaze with this tweet. FBI Dir just informed me, \"The FBI has learned of the existence of emails that appear to be pertinent to the investigation.\" Case reopened \\n— Jason Chaffetz (@jasoninthehouse) October 28, 2016 \\nOf course, we now know that this was not the case . Comey was actually saying that it was reviewing the emails in light of “an unrelated case”–which we now know to be Anthony Weiner’s sexting with a teenager. But apparently such little things as facts didn’t matter to Chaffetz. The Utah Republican had already vowed to initiate a raft of investigations if Hillary wins–at least two years’ worth, and possibly an entire term’s worth of them. Apparently Chaffetz thought the FBI was already doing his work for him–resulting in a tweet that briefly roiled the nation before cooler heads realized it was a dud. \\nBut according to a senior House Democratic aide, misreading that letter may have been the least of Chaffetz’ sins. That aide told Shareblue that his boss and other Democrats didn’t even know about Comey’s letter at the time–and only found out when they checked Twitter. “Democratic Ranking Members on the relevant committees didn’t receive Comey’s letter until after the Republican Chairmen. In fact, the Democratic Ranking Members didn’ receive it until after the Chairman of the Oversight and Government Reform Committee, Jason Chaffetz, tweeted it out and made it public.” \\nSo let’s see if we’ve got this right. The FBI director tells Chaffetz and other GOP committee chairmen about a major development in a potentially politically explosive investigation, and neither Chaffetz nor his other colleagues had the courtesy to let their Democratic counterparts know about it. Instead, according to this aide, he made them find out about it on Twitter. \\nThere has already been talk on Daily Kos that Comey himself provided advance notice of this letter to Chaffetz and other Republicans, giving them time to turn on the spin machine. That may make for good theater, but there is nothing so far that even suggests this is the case. After all, there is nothing so far that suggests that Comey was anything other than grossly incompetent and tone-deaf. \\nWhat it does suggest, however, is that Chaffetz is acting in a way that makes Dan Burton and Darrell Issa look like models of responsibility and bipartisanship. He didn’t even have the decency to notify ranking member Elijah Cummings about something this explosive. If that doesn’t trample on basic standards of fairness, I don’t know what does. \\nGranted, it’s not likely that Chaffetz will have to answer for this. He sits in a ridiculously Republican district anchored in Provo and Orem; it has a Cook Partisan Voting Index of R+25, and gave Mitt Romney a punishing 78 percent of the vote in 2012. Moreover, the Republican House leadership has given its full support to Chaffetz’ planned fishing expedition. But that doesn’t mean we can’t turn the hot lights on him. After all, he is a textbook example of what the House has become under Republican control. And he is also the Second Worst Person in the World. About Darrell Lucus \\nDarrell is a 30-something graduate of the University of North Carolina who considers himself a journalist of the old school. An attempt to turn him into a member of the religious right in college only succeeded in turning him into the religious right\\'s worst nightmare--a charismatic Christian who is an unapologetic liberal. His desire to stand up for those who have been scared into silence only increased when he survived an abusive three-year marriage. You may know him on Daily Kos as Christian Dem in NC . Follow him on Twitter @DarrellLucus or connect with him on Facebook . Click here to buy Darrell a Mello Yello. Connect'"
      ]
     },
     "execution_count": 146,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['text'][0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Machine Learning\n",
    "\n",
    "## Feature Extraction"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:12.588834Z",
     "start_time": "2019-01-19T05:53:12.580753Z"
    }
   },
   "outputs": [],
   "source": [
    "?CountVectorizer\n",
    "#setting max_df, min_df, max_features to avoid memory explode"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:27.273402Z",
     "start_time": "2019-01-19T05:53:12.590955Z"
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.feature_extraction.text import TfidfTransformer, CountVectorizer\n",
    "\n",
    "df=df.fillna(' ')\n",
    "df['total']=df['title']+' '+df['author']+df['text']\n",
    "transformer = TfidfTransformer(smooth_idf=False)\n",
    "count_vectorizer = CountVectorizer(ngram_range=(1,1), \n",
    "                                   stop_words = 'english',\n",
    "                                  max_features = 10000)\n",
    "counts = count_vectorizer.fit_transform(df['total'].values)\n",
    "tfidf = transformer.fit_transform(counts)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:27.280378Z",
     "start_time": "2019-01-19T05:53:27.275361Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10000"
      ]
     },
     "execution_count": 149,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(diction)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:27.296759Z",
     "start_time": "2019-01-19T05:53:27.283021Z"
    }
   },
   "outputs": [],
   "source": [
    "diction  = count_vectorizer.get_feature_names()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:27.304455Z",
     "start_time": "2019-01-19T05:53:27.299473Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['2010', '2011', '2012', '2013', '2014']"
      ]
     },
     "execution_count": 151,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "diction[100:105]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:29.845396Z",
     "start_time": "2019-01-19T05:53:27.307264Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[array([0., 0., 0., ..., 0., 0., 0.]),\n",
       " array([0., 0., 0., ..., 0., 0., 0.]),\n",
       " array([0., 0., 0., ..., 0., 0., 0.])]"
      ]
     },
     "execution_count": 152,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tfidf = [i.toarray()[0] for i in tfidf]\n",
    "tfidf[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:29.850945Z",
     "start_time": "2019-01-19T05:53:29.847946Z"
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "y = df['label']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:31.032718Z",
     "start_time": "2019-01-19T05:53:29.853020Z"
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "Xtrain, Xtest, ytrain, ytest = train_test_split(tfidf, y, random_state=1, train_size = 0.8)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Neural Network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:31.038891Z",
     "start_time": "2019-01-19T05:53:31.035303Z"
    }
   },
   "outputs": [],
   "source": [
    "#打乱所有的数据顺序，形成数据集\n",
    "# indices为所有数据下标的一个全排列\n",
    "indices = np.random.permutation(len(tfidf))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:31.314607Z",
     "start_time": "2019-01-19T05:53:31.040803Z"
    }
   },
   "outputs": [],
   "source": [
    "#重新根据打乱的下标生成数据集dataset，标签集labels，以及对应的原始句子sentences\n",
    "dataset = [tfidf[i] for i in indices]\n",
    "labels = [y[i] for i in indices]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:31.502152Z",
     "start_time": "2019-01-19T05:53:31.317202Z"
    }
   },
   "outputs": [],
   "source": [
    "#对整个数据集进行划分，分为：训练集、校准集和测试集，\n",
    "# 其中校准和测试集合的长度都是整个数据集的10分之一\n",
    "test_size = len(dataset) // 10\n",
    "train_data = dataset[2 * test_size :]\n",
    "train_label = labels[2 * test_size :]\n",
    "\n",
    "valid_data = dataset[: test_size]\n",
    "valid_label = labels[: test_size]\n",
    "\n",
    "test_data = dataset[test_size : 2 * test_size]\n",
    "test_label = labels[test_size : 2 * test_size]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:31.508418Z",
     "start_time": "2019-01-19T05:53:31.504553Z"
    }
   },
   "outputs": [],
   "source": [
    "#PyTorch用的包\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim\n",
    "from torch.autograd import Variable"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:31.519291Z",
     "start_time": "2019-01-19T05:53:31.510579Z"
    }
   },
   "outputs": [],
   "source": [
    "# 一个简单的前馈神经网络，三层，第一层线性层，加一个非线性ReLU，第二层线性层，中间有10个隐含层神经元\n",
    "# 输入维度为词典的大小：每一段评论的词袋模型\n",
    "model = nn.Sequential(\n",
    "    nn.Linear(len(diction), 30),\n",
    "    nn.ReLU(),\n",
    "    nn.Linear(30, 2),\n",
    "    nn.LogSoftmax(dim = 1),\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:31.527586Z",
     "start_time": "2019-01-19T05:53:31.521325Z"
    }
   },
   "outputs": [],
   "source": [
    "def accuracy(predictions, labels):\n",
    "    \"\"\"计算预测错误率的函数，其中predictions是模型给出的一组预测结果，batch_size行num_classes列的矩阵，labels是数据之中的正确答案\"\"\"\n",
    "    pred = torch.max(predictions.data, 1)[1] # 对于任意一行（一个样本）的输出值的第1个维度，求最大，得到每一行的最大元素的下标\n",
    "    rights = pred.eq(labels.data.view_as(pred)).sum() #将下标与labels中包含的类别进行比较，并累计得到比较正确的数量\n",
    "    return rights, len(labels) #返回正确的数量和这一次一共比较了多少元素"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:31.533938Z",
     "start_time": "2019-01-19T05:53:31.529701Z"
    }
   },
   "outputs": [],
   "source": [
    "# 损失函数为交叉熵\n",
    "cost = torch.nn.NLLLoss()\n",
    "# 优化算法为Adam，可以自动调节学习率\n",
    "optimizer = torch.optim.Adam(model.parameters(), lr = 0.01)\n",
    "records = []"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 162,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:31.538362Z",
     "start_time": "2019-01-19T05:53:31.535790Z"
    }
   },
   "outputs": [],
   "source": [
    "from collections import Counter #搜集器，可以让统计词频更简单"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:53:31.549239Z",
     "start_time": "2019-01-19T05:53:31.540192Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Counter({0: 8349, 1: 8291})"
      ]
     },
     "execution_count": 163,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Counter(ytrain)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:57:40.432332Z",
     "start_time": "2019-01-19T05:53:36.731925Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第0轮，训练损失：0.61, 校验损失：0.70, 校验准确率: 0.48\n",
      "第0轮，训练损失：0.24, 校验损失：0.18, 校验准确率: 0.93\n",
      "第0轮，训练损失：0.21, 校验损失：0.13, 校验准确率: 0.95\n",
      "第0轮，训练损失：0.18, 校验损失：0.12, 校验准确率: 0.96\n",
      "第0轮，训练损失：0.16, 校验损失：0.14, 校验准确率: 0.96\n",
      "第0轮，训练损失：0.15, 校验损失：0.11, 校验准确率: 0.96\n",
      "第1轮，训练损失：0.15, 校验损失：0.11, 校验准确率: 0.96\n",
      "第1轮，训练损失：0.13, 校验损失：0.16, 校验准确率: 0.96\n",
      "第1轮，训练损失：0.12, 校验损失：0.16, 校验准确率: 0.96\n",
      "第1轮，训练损失：0.11, 校验损失：0.14, 校验准确率: 0.96\n",
      "第1轮，训练损失：0.10, 校验损失：0.17, 校验准确率: 0.96\n",
      "第1轮，训练损失：0.10, 校验损失：0.17, 校验准确率: 0.96\n",
      "第2轮，训练损失：0.09, 校验损失：0.20, 校验准确率: 0.96\n",
      "第2轮，训练损失：0.09, 校验损失：0.22, 校验准确率: 0.96\n",
      "第2轮，训练损失：0.08, 校验损失：0.19, 校验准确率: 0.97\n",
      "第2轮，训练损失：0.08, 校验损失：0.24, 校验准确率: 0.96\n",
      "第2轮，训练损失：0.07, 校验损失：0.27, 校验准确率: 0.96\n",
      "第2轮，训练损失：0.07, 校验损失：0.24, 校验准确率: 0.97\n"
     ]
    }
   ],
   "source": [
    "#循环10个Epoch\n",
    "losses = []\n",
    "for epoch in range(3):\n",
    "    for i, data in enumerate(zip(train_data, train_label)):\n",
    "        x, y = data\n",
    "        \n",
    "        # 需要将输入的数据进行适当的变形，主要是要多出一个batch_size的维度，也即第一个为1的维度\n",
    "        x = Variable(torch.FloatTensor(x).view(1,-1))\n",
    "        # x的尺寸：batch_size=1, len_dictionary\n",
    "        # 标签也要加一层外衣以变成1*1的张量\n",
    "        y = Variable(torch.LongTensor(np.array([y])))\n",
    "        # y的尺寸：batch_size=1, 1\n",
    "        \n",
    "        # 清空梯度\n",
    "        optimizer.zero_grad()\n",
    "        # 模型预测\n",
    "        predict = model(x)\n",
    "        # 计算损失函数\n",
    "        loss = cost(predict, y)\n",
    "        # 将损失函数数值加入到列表中\n",
    "        losses.append(loss.item())\n",
    "        # 开始进行梯度反传\n",
    "        loss.backward()\n",
    "        # 开始对参数进行一步优化\n",
    "        optimizer.step()\n",
    "        \n",
    "        # 每隔3000步，跑一下校验数据集的数据，输出临时结果\n",
    "        if i % 3000 == 0:\n",
    "            val_losses = []\n",
    "            rights = []\n",
    "            # 在所有校验数据集上实验\n",
    "            for j, val in enumerate(zip(valid_data, valid_label)):\n",
    "                x, y = val\n",
    "                x = Variable(torch.FloatTensor(x).view(1,-1))\n",
    "                y = Variable(torch.LongTensor(np.array([y])))\n",
    "                predict = model(x)\n",
    "                # 调用rightness函数计算准确度\n",
    "                right = accuracy(predict, y)\n",
    "                rights.append(right)\n",
    "                loss = cost(predict, y)\n",
    "                val_losses.append(loss.item())\n",
    "                \n",
    "            # 将校验集合上面的平均准确度计算出来\n",
    "            right_ratio = 1.0 * np.sum([i[0] for i in rights]) / np.sum([i[1] for i in rights])\n",
    "            print('第{}轮，训练损失：{:.2f}, 校验损失：{:.2f}, 校验准确率: {:.2f}'.format(epoch, np.mean(losses),\n",
    "                                                                        np.mean(val_losses), right_ratio))\n",
    "            records.append([np.mean(losses), np.mean(val_losses), right_ratio])\n",
    "            "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:58:51.223846Z",
     "start_time": "2019-01-19T05:58:50.979968Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制误差曲线\n",
    "a = [i[0] for i in records]\n",
    "b = [i[1] for i in records]\n",
    "c = [i[2] for i in records]\n",
    "plt.plot(a, label = 'Train Loss')\n",
    "plt.plot(b, label = 'Valid Loss')\n",
    "plt.plot(c, label = 'Valid Accuracy')\n",
    "plt.xlabel('Steps')\n",
    "plt.ylabel('Loss & Accuracy')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-19T05:49:12.851346Z",
     "start_time": "2019-01-19T05:49:12.440704Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制误差曲线\n",
    "a = [i[0] for i in records]\n",
    "b = [i[1] for i in records]\n",
    "c = [i[2] for i in records]\n",
    "plt.plot(a, label = 'Train Loss')\n",
    "plt.plot(b, label = 'Valid Loss')\n",
    "plt.plot(c, label = 'Valid Accuracy')\n",
    "plt.xlabel('Steps')\n",
    "plt.ylabel('Loss & Accuracy')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-18T10:47:54.270360Z",
     "start_time": "2019-01-18T10:47:54.049388Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制误差曲线\n",
    "a = [i[0] for i in records]\n",
    "b = [i[1] for i in records]\n",
    "c = [i[2] for i in records]\n",
    "plt.plot(a, label = 'Train Loss')\n",
    "plt.plot(b, label = 'Valid Loss')\n",
    "plt.plot(c, label = 'Valid Accuracy')\n",
    "plt.xlabel('Steps')\n",
    "plt.ylabel('Loss & Accuracy')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Naive Bayes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-07T11:14:25.514507Z",
     "start_time": "2019-01-07T11:13:42.933173Z"
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.naive_bayes import MultinomialNB\n",
    "model = MultinomialNB() # GaussianNB()\n",
    "model.fit(Xtrain.toarray(), ytrain)\n",
    "y_model = model.predict(Xtest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-07T11:14:59.575248Z",
     "start_time": "2019-01-07T11:14:59.559627Z"
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.88173076923076921"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score, roc_auc_score,  roc_curve, auc\n",
    "accuracy_score(ytest, y_model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-08T03:33:33.681382Z",
     "start_time": "2019-01-08T03:33:33.672815Z"
    },
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.88325583933537988"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "roc_auc_score(ytest, y_model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-01-08T03:34:51.851907Z",
     "start_time": "2019-01-08T03:34:51.845342Z"
    },
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.88325583933537988"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fpr, tpr, thresholds = roc_curve(ytest, y_model, pos_label=1)\n",
    "auc(fpr, tpr) "
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Slideshow",
  "kernelspec": {
   "display_name": "Python [conda env:anaconda]",
   "language": "python",
   "name": "conda-env-anaconda-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.4"
  },
  "latex_envs": {
   "LaTeX_envs_menu_present": true,
   "autoclose": false,
   "autocomplete": true,
   "bibliofile": "biblio.bib",
   "cite_by": "apalike",
   "current_citInitial": 1,
   "eqLabelWithNumbers": true,
   "eqNumInitial": 1,
   "hotkeys": {
    "equation": "Ctrl-E",
    "itemize": "Ctrl-I"
   },
   "labels_anchors": false,
   "latex_user_defs": false,
   "report_style_numbering": false,
   "user_envs_cfg": false
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": false,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "165px"
   },
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
